import time
"""装饰器"""""

# 装饰器的结构体就是闭包函数，修饰/装饰其他函数的工具，它可以修饰/增强其他函数的功能，减少你的代码量
# “器”就是一个工具
# “装饰” 装饰另一个函数
# 装饰器两大原则：
    # 1、不能修改被装饰函数的代码
    # 2、不能修改被装饰函数的调用方式


'''计算某函数的执行时间'''
def char_count(string):
    start_time = time.time()
    time.sleep(1)
    count_dict = {}
    for i in string:
        if i not in count_dict:
            count_dict[i] = 1
        else:
            count_dict[i] += 1
    end_time = time.time()
    print(f'执行时间是：{(end_time-start_time)}') # 0005426406860352s
    return count_dict

# 自定义装饰器：计算函数的执行时间
def calc_excute_time(func):

    def wrapple(*args,**kwargs):
        start_time = time.time()
        result = func(*args,**kwargs)  # 调用被装饰的函数
        end_time = time.time()
        print(f'执行时间是：{(end_time-start_time)}')
        return result
    return wrapple

'''装饰器使用方式一'''
# @calc_excute_time
def words_reverse(string):
    result_ls = []  # 结果列表
    current_words = []  # 当前单词列表 # ['h','e','l','l','o']
    for i in range(len(string)):
        # 判断字符是不是字母或数字或单引号
        if string[i].isalnum() or (string[i - 1].isalnum() and string[i + 1].isalnum() and string[i] == "\'"):
            current_words.append(string[i])  # 加入到当前单词列表中
        else:  # 当前单词结束了，可以将单词反转加入到结果列表中
            current_words.reverse()
            result_ls.append(''.join(current_words))
            current_words = []  # 清空列表
            result_ls.append(string[i])
    if current_words:  # 处理最后一个单词没有加入到结果列表的清空
        result_ls.append(''.join(current_words[::-1]))
    return ''.join(result_ls)

# print(words_reverse('hello world'))

'''使用装饰器方式二'''
print(calc_excute_time(words_reverse)('hello world'))